Prevalence and usefulness of MVC middleware in ASP.NET Core

MVC मिडिलवेयर की व्यापकता और उपयोगिता

जैसा कि हमने देखा कि MVC मिडिलवेयर एक बहुत ही व्यापक फ्रेमवर्क है जिसके भीतर अनेक प्रकार की कार्यक्षमताएं उपलब्ध हैं। इनकी सहायता से हम एप्लीकेशन को बहुत ही क्विकली और एफिशिएंटली बिल्ड कर सकते हैं। लेकिन MVC मिडिलवेयर सभी एप्लीकेशन में आवश्यक नहीं है क्योंकि इसमें इतनी ज्यादा कार्यक्षमताएं/फीचर्स हैं कि एप्लीकेशन की परफॉर्मेंस ओवरहेड (overhead) होती है।

MVC मिडिलवेयर में रूटिंग कॉन्फ़िगरेशन

आपके मन में यह विचार आ रहा होगा कि MVC मिडिलवेयर किस प्रकार एक रिक्वेस्ट को कंट्रोलर के पास भेज देता है? तो इसका उत्तर यह है कि MVC मिडिलवेयर को जब हम अपने मिडिलवेयर पाइपलाइन में ऐड(add) करते हैं, तो उसी के भीतर रूटीन को कॉन्फ़िगर करते हैं। रूटीन की कॉन्फ़िगरेशन के अनुसार ही MVC मिडिलवेयर किसी रिक्वेस्ट को संबंधित कंट्रोलर के पास प्रोसेसिंग करने के लिए भेज देता है। रूटीन से अभिप्राय रिक्वेस्ट पाथ से है। जब किसी URL के दो टुकड़े करते हैं, जैसे कि डोमेन और उसके बाद का हिस्सा, तो उस पाथ के हिस्से को हम पाथ (path) के नाम से जानते हैं।

URL पैटर्न के अंतर्गत हम इसी पाथ पर विचार करते हैं। किसी रिक्वेस्ट को भेजते समय URL के भीतर पाथ का जो पैटर्न होता है, उसकी मैचिंग रूटीन इंजन (Routing Engine) के द्वारा की जाती है। एप्लीकेशन के भीतर जितने भी पाथ उपलब्ध होते हैं, उन सब का डिटेल रूटीन इंजन के पास होता है। रूटीन इंजन के पास जब कोई पाथ प्राप्त होता है, तो वह रूटीन टेबल (Routing Table) में उपलब्ध पाथ से मैच करता है। जब पाथ मैच कर जाता है, तो वह संबंधित कंट्रोलर और एक्शन मेथड के पास प्रोसेसिंग करने के लिए रिक्वेस्ट को भेज देता है।

मॉडल बाइंडिंग: रिक्वेस्ट डेटा को हैंडल करना

जब ब्राउज़र के द्वारा रिक्वेस्ट भेजा जाता है, तो 

  • URL के भीतर क्वेरी स्ट्रिंग (Query String) के रूप में डेटा भेजा जा सकता है, 
  • रूट पैरामीटर (Route Parameter) के रूप में डेटा भेजा जा सकता है। 
  • इसके अलावा, रिक्वेस्ट के हेडर (Header) या बॉडी (Body) के भीतर भी डेटा को भेजा जा सकता है। 

कहने का अभिप्राय यह है कि ब्राउज़र या क्लाइंट के द्वारा रिक्वेस्ट को जब भेजा जाता है, तो उसके साथ डेटा भी भेजा जाता है। इस डेटा को प्रोसेस करने के लिए मॉडल बाइंडिंग (Model Binding) का कॉन्सेप्ट उपयोग होता है।

जब रिक्वेस्ट एक्शन मेथड के पास पहुंचता है, तो यदि एक्शन मेथड के भीतर पैरामीटर (parameters) होता है, तो रिक्वेस्ट में भेजे गए डेटा की बाइंडिंग एक्शन मेथड के पैरामीटर के साथ की जाती है, जिसे ही हम मॉडल बाइंडिंग कहते हैं।

यदि एक्शन मेथड के भीतर कोई पैरामीटर नहीं हो, तो ऐसी बाइंडिंग की संभावना नहीं होती है। कहने का अभिप्राय यह है कि रिक्वेस्ट में भेजे गए डेटा का कोई प्रोसेसिंग नहीं होता है। इसके विपरीत, यदि एक्शन मेथड में पैरामीटर होते हैं, तो उस पैरामीटर के साथ रिक्वेस्ट में भेजे गए डेटा की बाइंडिंग की जाती है। बाइंडिंग के बाद जो मॉडल प्राप्त होता है, उसे मॉडल बाइंडिंग कहते हैं और यह मॉडल बाइंडिंग को एक्शन मेथड के भीतर प्रोसेस करने के लिए भेज दिया जाता है।

एक्शन मेथड में मॉडल प्रोसेसिंग

अब हम विचार करेंगे कि एक्शन मेथड के भीतर मॉडल की प्रोसेसिंग किस प्रकार होती है:

  1. सबसे पहले, एक्शन मेथड के भीतर मॉडल बाइंडिंग के डेटा का वैलिडेशन होता है। दूसरे शब्दों में, बाइंडिंग मॉडल के भीतर जो डेटा होता है, उस डेटा की वैलिडेशन की जाती है।
  2. साथ ही, एप्लीकेशन मॉडल को अपडेट करने के लिए बाइंडिंग मॉडल का उपयोग किया जाता है。
  • एक्शन मेथड के द्वारा प्रोसेसिंग के पश्चात रिस्पॉन्स को मिडिलवेयर में भेज दिया जाता है।
  • यह रिस्पॉन्स आमतौर पर व्यू मॉडल (View Model) के रूप में होता है।

MVC मिडिलवेयर को कॉन्फ़िगर करना

अब तक आपने देखा कि MVC मिडिलवेयर का उपयोग करके किस प्रकार रिस्पॉन्स जनरेट किया जाता है। सवाल है कि आप अपने एप्लीकेशन में MVC मिडिलवेयर का उपयोग कैसे करेंगे? 

जैसा कि हम जानते हैं, किसी मिडिलवेयर से संबंधित पैकेज होता है, उस पैकेज को डाउनलोड करके इंस्टॉल करना पड़ता है। अतः, MVC मिडिलवेयर से संबंधित पैकेज को हमें डाउनलोड कर अपने प्रोजेक्ट में इंस्टॉल करना होगा। इसके लिए हमें NuGet पैकेज मैनेजर का उपयोग करना चाहिए।

जब हम पैकेज को अपने प्रोजेक्ट में इंस्टॉल कर लेते हैं, तो इसके बाद हम MVC सर्विस को उपयोग करने के लिए सर्विस कंटेनर के भीतर MVC सर्विस को रजिस्टर कर देते हैं। इसके लिए हमें निम्नलिखित मेथड का उपयोग करना होगा:

  • AddControllersWithViews(); (या services.AddMvc(); यदि आप पुराने .NET Core संस्करण का उपयोग कर रहे हैं)

इसी तरह, जब हम MVC मिडिलवेयर के भीतर इस MVC सर्विस ऑब्जेक्ट को उपयोग करना चाहते हैं, तो उसके लिए एक दूसरा एक्सटेंशन मेथड है जिसका उपयोग करते हैं। इस एक्सटेंशन मेथड के भीतर हम रूटिंग को भी डिफाइन करते हैं, जो कि लैम्ब्डा एक्सप्रेशन (Lambda Expression) की सहायता से किया जाता है।

  • UseRouting();
  • UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });

आशा करते हैं आपको समझ में आ गया होगा कि हम अपने एप्लीकेशन के भीतर किस प्रकार MVC एप्लीकेशन को कॉन्फ़िगर करते हैं। कॉन्फ़िगर करने के लिए हमें तीन चरण का उपयोग करना होता है:

  1. सबसे पहले हमें पैकेज को इंस्टॉल करना होता है।
  2. उसके बाद हमें सर्विस को रजिस्टर करना होता है।
  3. और तीसरे चरण में हम अपने MVC मिडिलवेयर को कॉन्फ़िगर करते हैं।

कंट्रोलर: एंट्री पॉइंट और सहायक विधियाँ

इस अनुच्छेद में हम कंट्रोलर के बारे में कुछ प्रमुख बिंदुओं का उल्लेख करेंगे। 

सबसे पहले यह समझें कि कंट्रोलर एक आम क्लास की तरह ही होता है। उसमें जब आप पब्लिक मेथड का उपयोग करते हैं, तो उसे पब्लिक मेथड को हम एक्शन मेथड कहते हैं, जो HTTP रिक्वेस्ट ऑब्जेक्ट को प्रोसेस करता है।

आमतौर पर जब आप टेंपलेट का उपयोग करके कंट्रोलर बनाते हैं, तो उस कंट्रोलर को एक बेस कंट्रोलर (Base Controller) से इनहेरिट किया जाता है। इस बेसिक कंट्रोलर के भीतर कई सारे हेल्पर मेथड (Helper Methods) होते हैं जिनकी सहायता से डेवलपर को रिक्वेस्ट को प्रोसेस करना आसान हो जाता है। 

उदाहरण के लिए, जब मॉडल की वैलिडेशन करनी होती है, तो उसके लिए ModelState नामक प्रॉपर्टी का उपयोग किया जाता है। यह ModelState प्रॉपर्टी बेस कंट्रोलर के भीतर हेल्पर प्रॉपर्टी के रूप में उपलब्ध होता है।

ऐसे याद रखें कि कंट्रोलर के लिए कोई जरूरी नहीं है कि वह बेस कंट्रोलर को इनहेरिट करे। इसके बिना भी आप अपने कंट्रोलर को उपयोग कर सकते हैं, लेकिन आपको हेल्पर मेथड का लाभ नहीं मिलेगा।

बेस कंट्रोलर के भीतर ऐसे भी मेथड होते हैं जो व्यू को रिटर्न करते हैं, उदाहरण के लिए ViewResultActionResultPartialViewResult इत्यादि। इन सबको प्राप्त करने के लिए आपको हेल्पर मेथड होते हैं। 

यदि आप व्यू से संबंधित हेल्पर मेथड नहीं चाहते तो आप ControllerBase नामक क्लास से इनहेरिट कर सकते हैं।

आमतौर पर जब वेब API को डेवलप करते हैं, तो उस समय ControllerBase नामक क्लास का उपयोग करते हैं।

टिप्पणियाँ

इस ब्लॉग से लोकप्रिय पोस्ट

Differences between in-process and out-of-process hosting models

Web Fundamental Concepts in Hindi for Beginners - FAQs with their Answers Part-1

Introduction to ASP.NET Core and Web Frameworks